package com.itheima.mybackstudy.study5duotai;

public class Test {
    /*
    1.多态的前提条件：
    a.有继承/实现
    b.有方法重写
    c.有父类引用指向子类对象
    2、多态成员特点：
    成员变量:编译看左边，运行看左边
    eg:
    Animal animal=new Dog();
    打印animal.name看左边父类，父类是接口还是类都看左边。
    父类没有继续向上找。没有则错误。

    成员方法：编译看左边，运行看右边
    Animal animal=new Dog();
    运行animal.eat()方法，看左边，左边是接口还是类只要有eat()方法
    编译就会正确，运行则找右边的Dog里面的eat方法。
    3、多态的优缺点：
    a、优点：程序拓展性强（当父类的接口或者类作为方法参数传递时，可以接受所有的实现或者继承类）
    b、缺点：无法访问子类特有的成员
    4、解决上面缺点：
    多态转型：向上转型，向下转型

    2.多态
     */
    public static void main(String[] args) {
        function(new Lu());//省略对象名直接传递
        System.out.println("--------");
        function(new Ma());
    }
    //父类引用（父类接口)可以接受所有子类对象，多态
    public  static void function(Animal animal){//向上转型
        animal.eat();
        if(animal instanceof Ma){//需要判断类型，防止指鹿为马类型不匹配
            Ma ma=(Ma)animal;//强转（向下转型）
            ma.run();
        }
        if(animal instanceof Lu){
             Lu lu=(Lu) animal;
            lu.jump();
        }
    }
}
